home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
editor
/
proged10.lha
/
InstallProgED
/
sources
/
PED_APIExample
/
PED_API.c
next >
Wrap
C/C++ Source or Header
|
1995-07-27
|
6KB
|
280 lines
/******
* Include vari
******/
#include "ProgED:sources/include/Ped.h"
#include <stdio.h>
#include <stdlib.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <rexx/errors.h>
/******
* Prototipi funzioni
******/
LONG ASM SAVEDS CmdBeep( RG(a0) struct CommandData * );
void ApriMiaFinestra( void );
void ChiudiMiaFinestra( void );
void SendMessageToPED( struct APIMessage * );
/******
* Variabili globali
******/
struct IntuitionBase *IntuitionBase;
struct Window *PEDWindow;
struct Screen *PEDScreen;
struct MsgPort *MyPort,
*PEDPort;
static int tre=3;
struct ArexxExtCmds MyCmdBeep={
TRUE, /* TRUE=Comando esterno */
"BEEP", /* Nome del comando */
"NUM/N,FLAG/S", /* Template ReadArgs */
{&tre,0,}, /* Vettore di default per gli argomenti */
CmdBeep, /* Funzione di gestione del comando */
NULL /* Porre a NULL e non manipolare! Grazie. *****/
};
struct APIClient MyClient={
NULL, /* Questo campo sara' riempito dopo... */
NOTIFY_ON_SHOW_HIDE|NOTIFY_ON_KEY, /* Dimmi quando chiudi e riapri il tuo schermo e quando l'utente batte un tasto*/
"prova cliente", /* Nome del cliente (non utilizzato ancora) */
NULL /* Porre a NULL e non manipolare! Grazie. *****/
};
/*****
*
* FUNZIONE: void main(void)
*
* SCOPO: Cerca la porta API del ProgED, si registra come cliente ed
* apre una finestra sullo schermo del ProgED. Aggiunge un
* comando interno BEEP che, se eseguito da ProgED, il
* solo effetto di chiamare la funzione DisplayBeep (vedi
* la funzione CmdBeep).
*
* RESTITUISCE: -
*
****/
void main(void)
{
struct APIMessage msg,
*mess;
struct IntuiMessage *imsg;
UBYTE finito;
/***** Cerca la porta del ProgED *****/
if (!(PEDPort=FindPort("PED_API")))
{
printf("Can't find ProgED API Port!\n");
exit(0);
}
/***** Crea una porta che utilizzeremo per ricevere i msg dal ProgED *****/
if (!(MyPort=CreateMsgPort()))
{
printf("Can't create a MsgPort!\n");
exit(0);
}
/***** Riempi il campo ac_ClientPort della struttura APIClient che
utilizzeremo per la registrazione *****/
MyClient.ac_ClientPort=MyPort;
/***** Apri intuition.library :-)) *****/
if (!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0)))
{
DeleteMsgPort(MyPort);
printf("Can't open intuition.library!\n");
exit(0);
}
/***** Registriamoci come cliente presso il ProgED *****/
msg.am_MsgType=PED_API_REGISTER;
msg.am_MsgArg[0]=(ULONG)&MyClient;
SendMessageToPED(&msg);
/***** Aggiungi il comando interno BEEP *****/
msg.am_MsgType=PED_API_ADD_INTERNAL_COMMAND;
msg.am_MsgArg[0]=(ULONG)&MyCmdBeep;
SendMessageToPED(&msg);
/***** Ottiene l'indirizzo dello schermo del ProgED *****/
msg.am_MsgType=PED_API_GET_SCREEN_ADDRESS;
SendMessageToPED(&msg);
/***** Se e' non nullo apri una finestra. Se e' NULL ProgED e'
attualmente iconificato! In questo caso ci spedira' un
messaggio per farci sapere quando aprire la finestra. *****/
if (msg.am_RC) ApriMiaFinestra();
/***** Loop principale *****/
finito=FALSE;
while(!finito)
{
WaitPort(MyPort);
while(mess=(struct APIMessage *)GetMsg(MyPort))
{
switch(mess->am_MsgType)
{
/***** ProgED sta' per terminare! Terminiamo
anche noi :-( *****/
case PED_API_QUIT:
finito=TRUE;
break;
/***** ProgED sta' per chiudere il suo schermo.
Chiudiamo la nostra finestra. *****/
case PED_API_HIDE:
ChiudiMiaFinestra();
break;
/***** ProgED ha riaperto il suo schermo.
Riapriamo la nostra finestra. *****/
case PED_API_SHOW:
ApriMiaFinestra();
break;
/***** L'utente ha battuto il tasto RETURN *****/
case PED_API_KEY:
imsg=(struct IntuiMessage *)mess->am_MsgArg[0];
if (imsg->Code==196) DisplayBeep(0);
break;
}
mess->am_RC=0;
ReplyMsg((struct Message *)mess);
}
}
/***** Libera tutto ed esci *****/
DeleteMsgPort(MyPort);
CloseLibrary((struct Library *)IntuitionBase);
exit(0);
}
/*****
*
* FUNZIONE: void ApriMiaFinestra(void)
*
* SCOPO: Apre una finestra sullo schermo del ProgED.
*
* RESTITUISCE: -
*
****/
void ApriMiaFinestra(void)
{
PEDWindow=OpenWindowTags(NULL,
WA_Width, 100,
WA_Height, 80,
WA_Title, "Prova !!!!!!!!",
WA_DepthGadget, TRUE,
WA_SizeGadget, TRUE,
WA_DragBar, TRUE,
WA_SmartRefresh, TRUE,
WA_PubScreenName, "PED_SCREEN",
TAG_DONE);
}
/*****
*
* FUNZIONE: void ChiudiMiaFinestra(void)
*
* SCOPO: Chiude la finestra aperta tramite ApriMiaFinestra().
*
* RESTITUISCE: -
*
****/
void ChiudiMiaFinestra(void)
{
if (PEDWindow) CloseWindow(PEDWindow);
PEDWindow=NULL;
}
/*****
*
* FUNZIONE: LONG CmdBeep(struct CommandData *data)
*
* SCOPO: Questa e' la funzione di gestione del comando BEEP.
* Come e' possibile notare gli argomenti vengono estratti
* dal vettore data->CommandArg[]. ProgED ha gia' provveduto
* a chiamare la funzione ReadArgs per noi.
*
* Questo comando effettua un singolo beep se l'utente
* ha specificato il flag "FLAG" o "n" BEEP se l'utente
* utilizza il comando nella forma "BEEP NUM <n>".
*
* RESTITUISCE: -
*
****/
LONG ASM SAVEDS CmdBeep(RG(a0) struct CommandData *data)
{
long num=*((LONG *)data->CommandArgs[0]),
flag=(long)data->CommandArgs[1];
int i;
if (flag)
{
for(i=0;i<num;i++)
{
DisplayBeep(NULL);
Delay(50);
}
}
else DisplayBeep(NULL);
return(RC_OK);
}
/*****
*
* FUNZIONE: void SendMessageToPED(struct APIMessage *msg)
*
* SCOPO: Questa funzione spedisce un messaggio alla porta APi del
* ProgED.
*
* RESTITUISCE: -
*
****/
void SendMessageToPED(struct APIMessage *msg)
{
msg->am_Message.mn_Node.ln_Succ=NULL;
msg->am_Message.mn_Node.ln_Pred=NULL;
msg->am_Message.mn_Node.ln_Type=NT_MESSAGE;
msg->am_Message.mn_Node.ln_Pri=0;
msg->am_Message.mn_Node.ln_Name=NULL;
msg->am_Message.mn_ReplyPort=MyPort;
msg->am_Message.mn_Length=sizeof(struct APIMessage);
PutMsg(PEDPort,(struct Message *)msg);
WaitPort(MyPort);
while(GetMsg(MyPort));
}